home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / COMM / PCCP038.ARJ / SCRCHK.C < prev    next >
C/C++ Source or Header  |  1992-07-05  |  8KB  |  333 lines

  1. #include<stdio.h>
  2.  
  3. #define PROGSIZ 256
  4.  
  5. struct
  6.     {
  7.     char type;
  8.     unsigned char label;
  9.     }
  10.     miniprog[PROGSIZ];
  11.  
  12. main(argc, argv)
  13.     int argc;
  14.     char **argv;
  15.     {
  16.     FILE *scriptfd;
  17.     char fpname[256], str[81];
  18.     int proglen, i, value[8], flag;
  19.     short int labels[256];
  20.     if(argc!=2)
  21.         {
  22.         printf("USAGE: scrchk <sourcefile>");
  23.         exit(1);
  24.         }
  25.     if(getenv("TERMPATH")==NULL)
  26.         sprintf(fpname, "%s.scr", argv[1]);
  27.     else
  28.         sprintf(fpname, "%s\\%s.scr", getenv("TERMPATH"), argv[1]);
  29.     if((scriptfd=fopen(fpname, "r"))==NULL)
  30.         {
  31.         printf("Error opening script file %s.\n", fpname);
  32.         exit(2);
  33.         }
  34.     fgets(str, 80, scriptfd); /* Flush init params */
  35.     for(i=0;i<256;++i)
  36.         labels[i]=-1;
  37.     /* Parse */
  38.     printf("Parsing...\n");
  39.     for(proglen=0;proglen<PROGSIZ;++proglen)
  40.         {
  41.         if(fgets(str, 80, scriptfd)==NULL)
  42.             {
  43.             flag=1;
  44.             proglen++;
  45.             break;
  46.             }
  47.         for(i=0;i<80;++i)
  48.             if(str[i]=='\n')
  49.                 {
  50.                 str[i]='\0';
  51.                 break;
  52.                 }
  53.             else if(str[i]=='\0')
  54.                 break;
  55.         if(!strlen(str))
  56.             {
  57.             printf("---\n");
  58.             proglen--;
  59.             }
  60.         else
  61.             {
  62.             if((str[0]!=':')&&(str[0]!=';'))
  63.                 printf("%03d %s\n", proglen, str);
  64.             else
  65.                 printf("--- %s\n", str);
  66.             if((str[0]!=';')&&(str[0]!='c')&&(str[0]!='+')&&(str[0]!='-')&&(str[1]!=' '))
  67.                 {
  68.                 printf("*** Missing first delimiting space.\n");
  69.                 exit(11);
  70.                 }
  71.             switch(str[0])
  72.                 {
  73.                 case ':':
  74.                     if(sscanf(str, "%*c %d", &value[0])!=1)
  75.                         {
  76.                         printf("*** Bad scan of label (:)\n");
  77.                         exit(11);
  78.                         }
  79.                     if((value[0]<0)||(value[0]>255))
  80.                         {
  81.                         printf("*** Label out of range\n");
  82.                         exit(11);
  83.                         }
  84.                     if(labels[value[0]]!=-1)
  85.                         {
  86.                         printf("*** Label duplicated\n", value[0], proglen);
  87.                         exit(11);
  88.                         }
  89.                     labels[value[0]]=proglen;
  90.                     proglen--;
  91.                     break;
  92.                 case '*':
  93.                     miniprog[proglen].type='*';
  94.                     if(sscanf(str, "%*c %d", &value[0])!=1)
  95.                         {
  96.                         printf("*** Bad scan.\n");
  97.                         exit(11);
  98.                         }
  99.                     if(value[0]>255)
  100.                         {
  101.                         printf("*** Label out of range.\n");
  102.                         exit(11);
  103.                         }
  104.                     if(value[0]>=0)
  105.                         miniprog[proglen].label=(unsigned char)value[0];
  106.                     else
  107.                         miniprog[proglen].label=0;
  108.                     break;
  109.                 case 'g':
  110.                 case 'G':
  111.                     miniprog[proglen].type='g';
  112.                     if(sscanf(str, "%*c %d", &value[0])!=1)
  113.                         {
  114.                         printf("*** Bad scan\n");
  115.                         exit(11);
  116.                         }
  117.                     if((value[0]<0)||(value[0]>255))
  118.                         {
  119.                         printf("*** Label out of range.\n");
  120.                         exit(11);
  121.                         }
  122.                     miniprog[proglen].label=(unsigned char)value[0];
  123.                     break;
  124.                 case 'r':
  125.                 case 'R':
  126.                     miniprog[proglen].type='r';
  127.                     if(sscanf(str, "%*c %d %d %d", &value[0], &value[1], &value[2])!=3)
  128.                         {
  129.                         printf("*** Bad scan\n");
  130.                         exit(11);
  131.                         }
  132.                     if((value[0]<0)||(value[0]>255))
  133.                         {
  134.                         printf("*** Label out of range.\n");
  135.                         exit(11);
  136.                         }
  137.                     if((value[2]<0)||(value[2]>255))
  138.                         {
  139.                         printf("*** Retry handle out of range.\n");
  140.                         exit(11);
  141.                         }
  142.                     miniprog[proglen].label=(unsigned char)value[0];
  143.                     break;
  144.                 case '0':
  145.                     miniprog[proglen].type='0';
  146.                     if(sscanf(str, "%*c %d", &value[0])!=1)
  147.                         {
  148.                         printf("*** Bad scan\n");
  149.                         exit(11);
  150.                         }
  151.                     if((value[0]<0)||(value[0]>255))
  152.                         {
  153.                         printf("*** Retry handle out of range.\n");
  154.                         exit(11);
  155.                         }
  156.                     break;
  157.                 case 'p':
  158.                 case 'P':
  159.                     miniprog[proglen].type='p';
  160.                     if(sscanf(str, "%*c %d", &value[0])!=1)
  161.                         {
  162.                         printf("*** Bad scan\n");
  163.                         exit(11);
  164.                         }
  165.                     break;
  166.                 case 'w':
  167.                 case 'W':
  168.                     miniprog[proglen].type='w';
  169.                     if(sscanf(str, "%*c %d", &value[0])!=1)
  170.                         {
  171.                         printf("*** Bad scan\n");
  172.                         exit(11);
  173.                         }
  174.                     break;
  175.                 case '>':
  176.                     miniprog[proglen].type='>';
  177.                     if(sscanf(str, "%*c %d", &value[0])!=1)
  178.                         {
  179.                         printf("*** Bad scan\n");
  180.                         exit(11);
  181.                         }
  182.                     if((value[0]<0)||(value[0]>255))
  183.                         {
  184.                         printf("*** Label out of range.\n");
  185.                         exit(11);
  186.                         }
  187.                     miniprog[proglen].label=(unsigned char)value[0];
  188.                     break;
  189.                 case 'k':
  190.                 case 'K':
  191.                     miniprog[proglen].type='k';
  192.                     if(sscanf(str, "%*c %d", &value[0])!=1)
  193.                         {
  194.                         printf("*** Bad scan\n");
  195.                         exit(11);
  196.                         }
  197.                     if((value[0]<0)||(value[0]>255))
  198.                         {
  199.                         printf("*** Label out of range.\n");
  200.                         exit(11);
  201.                         }
  202.                     miniprog[proglen].label=(unsigned char)value[0];
  203.                     break;
  204.                 case '?':
  205.                     miniprog[proglen].type='?';
  206.                     if(sscanf(str, "%*c %d", &value[0])!=1)
  207.                         {
  208.                         printf("*** Bad scan\n");
  209.                         exit(11);
  210.                         }
  211.                     if((value[0]<0)||(value[0]>255))
  212.                         {
  213.                         printf("*** Label out of range.\n");
  214.                         exit(11);
  215.                         }
  216.                     miniprog[proglen].label=value[0];
  217.                     break;
  218.                 case 'd':
  219.                 case 'D':
  220.                     miniprog[proglen].type='d';
  221.                     if(sscanf(str, "%*c %d", &value[0])!=1)
  222.                         {
  223.                         printf("*** Bad scan\n");
  224.                         exit(11);
  225.                         }
  226.                     if((value[0]<0)||(value[0]>255))
  227.                         {
  228.                         printf("*** Label out of range.\n");
  229.                         exit(11);
  230.                         }
  231.                     miniprog[proglen].label=value[0];
  232.                     break;
  233.                 case '<':
  234.                     miniprog[proglen].type='<';
  235.                     break;
  236.                 case '+':
  237.                     miniprog[proglen].type='+';
  238.                     break;
  239.                 case 'c':
  240.                     miniprog[proglen].type='c';
  241.                     break;
  242.                 case '-':
  243.                     miniprog[proglen].type='-';
  244.                     break;
  245.                 case '!':
  246.                     miniprog[proglen].type='!';
  247.                     break;
  248.                 case 'x':
  249.                 case 'X':
  250.                     miniprog[proglen].type='s';
  251.                     if(sscanf(str, "%*c %d", &value[0])!=1)
  252.                         {
  253.                         printf("*** Bad scan\n");
  254.                         exit(11);
  255.                         }
  256.                     if((value[0]<0)||(value[0]>255))
  257.                         {
  258.                         printf("*** Label out of range.\n");
  259.                         exit(11);
  260.                         }
  261.                     miniprog[proglen].label=value[0];
  262.                     break;
  263.                 case 's':
  264.                 case 'S':
  265.                     miniprog[proglen].type='s';
  266.                     if(sscanf(str, "%*c %d", &value[0])!=1)
  267.                         {
  268.                         printf("*** Bad scan\n");
  269.                         exit(11);
  270.                         }
  271.                     if((value[0]<0)||(value[0]>255))
  272.                         {
  273.                         printf("*** Label out of range.\n");
  274.                         exit(11);
  275.                         }
  276.                     miniprog[proglen].label=value[0];
  277.                     break;
  278.                 case 'q':
  279.                 case 'Q':
  280.                     miniprog[proglen].type='q';
  281.                     if(sscanf(str, "%*c %d", &value[0])!=1)
  282.                         {
  283.                         printf("*** Bad scan\n");
  284.                         exit(11);
  285.                         }
  286.                     if((value[0]<128)&&(value[0]!=0))
  287.                         {
  288.                         printf("*** Quit with reserved exit code (!=0&&<128)\n");
  289.                         exit(11);
  290.                         }
  291.                     break;
  292.                 case ';':
  293.                     proglen--;
  294.                     break;
  295.                 default:
  296.                     printf("*** Bad command character\n");
  297.                     exit(10);
  298.                 }
  299.             }
  300.         }
  301.     if(!flag)
  302.         {
  303.         printf("Program too long.\n");
  304.         exit(11);
  305.         }
  306.     /* Check labels */
  307.     printf("\n\nChecking branch label validity...\n");
  308.     for(i=0;i<proglen;i++)
  309.         switch(miniprog[i].type)
  310.             {
  311.             case 'g':
  312.             case '?':
  313.             case 'd':
  314.                 if(labels[miniprog[i].label]==-1)
  315.                     printf("Unlisted label %d at statement %d (%c).\n", miniprog[i].label, i, miniprog[i].type);
  316.                 break;
  317.             case 'r':
  318.                 if(labels[miniprog[i].label]==-1)
  319.                     printf("Unlisted label %d at statement %d (%c).\n", miniprog[i].label, i, miniprog[i].type);
  320.                 break;
  321.             case '>':
  322.                 if(labels[miniprog[i].label]==-1)
  323.                     printf("Unlisted label %d at statement %d (%c).\n", miniprog[i].label, i, miniprog[i].type);
  324.                 break;
  325.             case 'x':
  326.             case 's':
  327.                 if(labels[miniprog[i].label]==-1)
  328.                     printf("Unlisted label %d at statement %d (%c).\n", miniprog[i].label, i, miniprog[i].type);
  329.                 break;
  330.             }
  331.     printf("\nDone.\n");
  332.     }
  333.